package com.jiazhong.basic.pack0724;

import lombok.SneakyThrows;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class DemoH {

    // 序列化：将内存中的对象保存到硬盘的过程
    @SneakyThrows
    private static void a() {
        Student stu = new Student();
        stu.setId(1);
        stu.setName("张三");
        stu.setGender('男');
        stu.setAge((int) (Math.random() * 100 + 1));

        // 2.产生一个文件
        File file = new File("/Users/dailyblue/workspace/io/stu.obj");
        // 3.产生字节输出流对象
        OutputStream os = new FileOutputStream(file);
        // 4.产生一个操作序列化的对象
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(stu);
        oos.close();
        os.close();

    }

    // 反序列化：将硬盘中的文件读取到内存的过程
    @SneakyThrows
    private static void b() {
        // 2.要读取的对象文件
        File file = new File("/Users/dailyblue/workspace/io/stu.obj");
        // 3.产生读取对象
        InputStream in = new FileInputStream(file);
        // 4.产生一个反序列化的对象
        ObjectInputStream ois = new ObjectInputStream(in);
        Object obj = ois.readObject();
        System.out.println(obj);
        ois.close();
        in.close();
    }

    // 序列化：将内存中的对象保存到硬盘的过程 将多个对象进行序列化
    @SneakyThrows
    private static void c() {
        List<Student> list = new ArrayList<>();
        for (int i = 1; i < 5; i++) {
            Student stu = new Student();
            stu.setId(i);
            stu.setName("张三" + i);
            stu.setGender('男');
            stu.setAge((int) (Math.random() * 100 + 1));
            list.add(stu);
        }

        // 2.产生一个文件
        File file = new File("/Users/dailyblue/workspace/io/stu.obj");
        // 3.产生字节输出流对象
        OutputStream os = new FileOutputStream(file);
        // 4.产生一个操作序列化的对象
        ObjectOutputStream oos = new ObjectOutputStream(os);
        for (int i = 0; i < list.size(); i++) {
            oos.writeObject(list.get(i));
        }
        oos.close();
        os.close();

    }

    // 反序列化：将硬盘中的文件读取到内存的过程
    @SneakyThrows
    private static void d() {
        // 2.要读取的对象文件
        File file = new File("/Users/dailyblue/workspace/io/stu.obj");
        // 3.产生读取对象
        InputStream in = new FileInputStream(file);
        // 4.产生一个反序列化的对象
        ObjectInputStream ois = new ObjectInputStream(in);
        while (true) {
            try {
                Object obj = ois.readObject();
                System.out.println(obj);
            } catch (Exception e) {
                break;
            }
        }
        ois.close();
        in.close();
    }

    public static void main(String[] args) {
        b();
    }
}
